// JSON Processing (JSON处理) 示例
// 演示 Pascal 中JSON处理的各种用法
program p_48_json_processing;

{$mode objfpc}{$H+}
// {$mode objfpc} 启用 Object Pascal 模式
// {$H+} 启用长字符串支持（AnsiString）

// 引入单元文件
uses
  SysUtils,        // 系统工具单元
  fpjson,          // JSON处理单元
  jsonparser;      // JSON解析单元

// JSON对象的创建和操作示例
procedure CreateAndManipulateJSONObject;
var
  jsonObject: TJSONObject;
  jsonString: String;
begin
  WriteLn('1. JSON对象的创建和操作:');
  
  // 创建JSON对象
  jsonObject := TJSONObject.Create;
  try
    // 添加键值对
    jsonObject.Add('name', '张三');
    jsonObject.Add('age', 30);
    jsonObject.Add('email', 'zhangsan@example.com');
    jsonObject.Add('isStudent', False);
    
    // 转换为字符串
    jsonString := jsonObject.AsJSON;
    WriteLn('  创建的JSON对象:');
    WriteLn('    ', jsonString);
    
    // 获取值
    WriteLn('  获取的值:');
    WriteLn('    姓名: ', jsonObject.Get('name', ''));
    WriteLn('    年龄: ', jsonObject.Get('age', 0));
    WriteLn('    邮箱: ', jsonObject.Get('email', ''));
    WriteLn('    是否学生: ', BoolToStr(jsonObject.Get('isStudent', True), True));
    
    // 修改值
    jsonObject.Add('age', 31);
    WriteLn('  修改年龄后: ', jsonObject.Get('age', 0));
    
    // 删除键
    jsonObject.Delete('isStudent');
    WriteLn('  删除isStudent键后:');
    WriteLn('    ', jsonObject.AsJSON);
  finally
    jsonObject.Free;
  end;
end;

// JSON数组的处理示例
procedure JSONArrayProcessing;
var
  jsonArray: TJSONArray;
  jsonObject: TJSONObject;
  jsonString: String;
begin
  WriteLn('2. JSON数组的处理:');
  
  // 创建JSON数组
  jsonArray := TJSONArray.Create;
  try
    // 添加简单值
    jsonArray.Add('苹果');
    jsonArray.Add('香蕉');
    jsonArray.Add('橙子');
    jsonArray.Add(42);
    jsonArray.Add(True);
    
    WriteLn('  简单JSON数组:');
    WriteLn('    ', jsonArray.AsJSON);
    
    // 创建包含对象的数组
    jsonArray.Clear;
    
    // 添加第一个对象
    jsonObject := TJSONObject.Create;
    jsonObject.Add('id', 1);
    jsonObject.Add('name', '产品A');
    jsonObject.Add('price', 29.99);
    jsonArray.Add(jsonObject);
    
    // 添加第二个对象
    jsonObject := TJSONObject.Create;
    jsonObject.Add('id', 2);
    jsonObject.Add('name', '产品B');
    jsonObject.Add('price', 39.99);
    jsonArray.Add(jsonObject);
    
    // 添加第三个对象
    jsonObject := TJSONObject.Create;
    jsonObject.Add('id', 3);
    jsonObject.Add('name', '产品C');
    jsonObject.Add('price', 19.99);
    jsonArray.Add(jsonObject);
    
    WriteLn('  对象JSON数组:');
    WriteLn('    ', jsonArray.AsJSON);
    
    // 访问数组元素
    WriteLn('  数组元素访问:');
    for var i := 0 to jsonArray.Count - 1 do
    begin
      var item := jsonArray.Items[i] as TJSONObject;
      WriteLn('    [', i, '] ID: ', item.Get('id', 0), 
              ', 名称: ', item.Get('name', ''), 
              ', 价格: ', item.Get('price', 0.0):0:2);
    end;
  finally
    jsonArray.Free;
  end;
end;

// JSON数据的解析示例
procedure JSONDataParsing;
var
  jsonString: String;
  jsonData: TJSONData;
  jsonObject: TJSONObject;
  jsonArray: TJSONArray;
begin
  WriteLn('3. JSON数据的解析:');
  
  // 解析简单JSON对象
  jsonString := '{"name": "李四", "age": 25, "city": "北京", "hobbies": ["读书", "游泳", "编程"]}';
  WriteLn('  原始JSON字符串:');
  WriteLn('    ', jsonString);
  
  jsonData := GetJSON(jsonString);
  try
    jsonObject := TJSONObject(jsonData);
    
    WriteLn('  解析结果:');
    WriteLn('    姓名: ', jsonObject.Get('name', ''));
    WriteLn('    年龄: ', jsonObject.Get('age', 0));
    WriteLn('    城市: ', jsonObject.Get('city', ''));
    
    // 解析数组
    var hobbies := TJSONArray(jsonObject.Find('hobbies'));
    if Assigned(hobbies) then
    begin
      WriteLn('    爱好:');
      for var i := 0 to hobbies.Count - 1 do
        WriteLn('      - ', hobbies.Strings[i]);
    end;
  finally
    jsonData.Free;
  end;
  
  WriteLn;
  
  // 解析复杂的嵌套JSON
  jsonString := '{' +
                '"company": "科技公司",' +
                '"employees": [' +
                '  {"name": "王五", "department": "开发部", "salary": 8000},' +
                '  {"name": "赵六", "department": "测试部", "salary": 6000}' +
                '],' +
                '"founded": "2020-01-01",' +
                '"isPublic": false' +
                '}';
  
  WriteLn('  复杂嵌套JSON:');
  WriteLn('    ', jsonString);
  
  jsonData := GetJSON(jsonString);
  try
    jsonObject := TJSONObject(jsonData);
    
    WriteLn('  解析结果:');
    WriteLn('    公司名称: ', jsonObject.Get('company', ''));
    WriteLn('    成立日期: ', jsonObject.Get('founded', ''));
    WriteLn('    是否上市公司: ', BoolToStr(jsonObject.Get('isPublic', True), True));
    
    // 解析员工数组
    jsonArray := TJSONArray(jsonObject.Find('employees'));
    if Assigned(jsonArray) then
    begin
      WriteLn('    员工信息:');
      for var i := 0 to jsonArray.Count - 1 do
      begin
        var employee := TJSONObject(jsonArray.Items[i]);
        WriteLn('      姓名: ', employee.Get('name', ''),
                ', 部门: ', employee.Get('department', ''),
                ', 薪资: ', employee.Get('salary', 0));
      end;
    end;
  finally
    jsonData.Free;
  end;
end;

// JSON数据的生成示例
procedure JSONDataGeneration;
var
  jsonObject: TJSONObject;
  jsonArray: TJSONArray;
  jsonString: String;
begin
  WriteLn('4. JSON数据的生成:');
  
  // 生成个人信息JSON
  jsonObject := TJSONObject.Create;
  try
    jsonObject.Add('id', 1001);
    jsonObject.Add('firstName', '张');
    jsonObject.Add('lastName', '三');
    jsonObject.Add('fullName', '张三');
    jsonObject.Add('age', 28);
    jsonObject.Add('email', 'zhangsan@example.com');
    
    // 添加地址信息（嵌套对象）
    var addressObj := TJSONObject.Create;
    addressObj.Add('street', '长安街100号');
    addressObj.Add('city', '北京');
    addressObj.Add('zipCode', '100000');
    jsonObject.Add('address', addressObj);
    
    // 添加电话号码（数组）
    var phonesArray := TJSONArray.Create;
    phonesArray.Add('13800138000');
    phonesArray.Add('010-12345678');
    jsonObject.Add('phones', phonesArray);
    
    jsonString := jsonObject.AsJSON;
    WriteLn('  生成的个人信息JSON:');
    WriteLn('    ', jsonString);
  finally
    jsonObject.Free;
  end;
  
  WriteLn;
  
  // 生成产品列表JSON
  jsonArray := TJSONArray.Create;
  try
    // 添加产品1
    var product1 := TJSONObject.Create;
    product1.Add('id', 1);
    product1.Add('name', '笔记本电脑');
    product1.Add('category', '电子产品');
    product1.Add('price', 5999.99);
    product1.Add('inStock', True);
    jsonArray.Add(product1);
    
    // 添加产品2
    var product2 := TJSONObject.Create;
    product2.Add('id', 2);
    product2.Add('name', '无线鼠标');
    product2.Add('category', '电子产品');
    product2.Add('price', 99.99);
    product2.Add('inStock', True);
    jsonArray.Add(product2);
    
    // 添加产品3
    var product3 := TJSONObject.Create;
    product3.Add('id', 3);
    product3.Add('name', '机械键盘');
    product3.Add('category', '电子产品');
    product3.Add('price', 299.99);
    product3.Add('inStock', False);
    jsonArray.Add(product3);
    
    jsonString := jsonArray.AsJSON;
    WriteLn('  生成的产品列表JSON:');
    WriteLn('    ', jsonString);
  finally
    jsonArray.Free;
  end;
end;

// 复杂JSON结构的处理示例
procedure ComplexJSONStructureHandling;
var
  jsonString: String;
  jsonData: TJSONData;
  jsonObject: TJSONObject;
begin
  WriteLn('5. 复杂JSON结构的处理:');
  
  // 处理具有深层嵌套的JSON
  jsonString := '{' +
                '"apiVersion": "1.0",' +
                '"data": {' +
                '  "users": [' +
                '    {' +
                '      "id": 1,' +
                '      "profile": {' +
                '        "personal": {' +
                '          "name": "用户1",' +
                '          "age": 25' +
                '        },' +
                '        "contact": {' +
                '          "email": "user1@example.com",' +
                '          "phones": ["13800138001", "010-87654321"]' +
                '        }' +
                '      },' +
                '      "preferences": {' +
                '        "theme": "dark",' +
                '        "language": "zh-CN"' +
                '      }' +
                '    }' +
                '  ]' +
                '},' +
                '"timestamp": "2025-09-25T14:30:45Z"' +
                '}';
  
  WriteLn('  复杂嵌套JSON:');
  WriteLn('    ', jsonString);
  
  jsonData := GetJSON(jsonString);
  try
    jsonObject := TJSONObject(jsonData);
    
    WriteLn('  解析结果:');
    WriteLn('    API版本: ', jsonObject.Get('apiVersion', ''));
    WriteLn('    时间戳: ', jsonObject.Get('timestamp', ''));
    
    // 导航到深层数据
    var dataObj := TJSONObject(jsonObject.Find('data'));
    if Assigned(dataObj) then
    begin
      var usersArray := TJSONArray(dataObj.Find('users'));
      if Assigned(usersArray) and (usersArray.Count > 0) then
      begin
        var userObj := TJSONObject(usersArray.Items[0]);
        var id := userObj.Get('id', 0);
        WriteLn('    用户ID: ', id);
        
        var profileObj := TJSONObject(userObj.Find('profile'));
        if Assigned(profileObj) then
        begin
          var personalObj := TJSONObject(profileObj.Find('personal'));
          if Assigned(personalObj) then
          begin
            WriteLn('    用户姓名: ', personalObj.Get('name', ''));
            WriteLn('    用户年龄: ', personalObj.Get('age', 0));
          end;
          
          var contactObj := TJSONObject(profileObj.Find('contact'));
          if Assigned(contactObj) then
          begin
            WriteLn('    邮箱: ', contactObj.Get('email', ''));
            
            var phonesArray := TJSONArray(contactObj.Find('phones'));
            if Assigned(phonesArray) then
            begin
              WriteLn('    电话号码:');
              for var i := 0 to phonesArray.Count - 1 do
                WriteLn('      - ', phonesArray.Strings[i]);
            end;
          end;
        end;
        
        var preferencesObj := TJSONObject(userObj.Find('preferences'));
        if Assigned(preferencesObj) then
        begin
          WriteLn('    主题: ', preferencesObj.Get('theme', ''));
          WriteLn('    语言: ', preferencesObj.Get('language', ''));
        end;
      end;
    end;
  finally
    jsonData.Free;
  end;
end;

// JSON在实际应用中的使用示例
procedure PracticalJSONApplications;
var
  configJson: TJSONObject;
  userJson: TJSONObject;
  settingsJson: TJSONObject;
begin
  WriteLn('6. JSON在实际应用中的使用:');
  
  // 配置文件处理
  WriteLn('  配置文件处理:');
  configJson := TJSONObject.Create;
  try
    configJson.Add('appName', 'MyApp');
    configJson.Add('version', '1.0.0');
    configJson.Add('debug', True);
    
    var dbConfig := TJSONObject.Create;
    dbConfig.Add('host', 'localhost');
    dbConfig.Add('port', 3306);
    dbConfig.Add('username', 'admin');
    dbConfig.Add('password', 'secret');
    configJson.Add('database', dbConfig);
    
    var logConfig := TJSONObject.Create;
    logConfig.Add('level', 'info');
    logConfig.Add('file', 'app.log');
    logConfig.Add('maxSize', '10MB');
    configJson.Add('logging', logConfig);
    
    WriteLn('    应用配置:');
    WriteLn('      ', configJson.AsJSON);
  finally
    configJson.Free;
  end;
  
  WriteLn;
  
  // 用户数据处理
  WriteLn('  用户数据处理:');
  userJson := TJSONObject.Create;
  try
    userJson.Add('userId', 12345);
    userJson.Add('username', 'john_doe');
    userJson.Add('registrationDate', '2025-01-15');
    userJson.Add('lastLogin', '2025-09-25T14:30:00Z');
    
    // 用户权限
    var permissions := TJSONArray.Create;
    permissions.Add('read');
    permissions.Add('write');
    permissions.Add('delete');
    userJson.Add('permissions', permissions);
    
    // 用户设置
    settingsJson := TJSONObject.Create;
    settingsJson.Add('theme', 'dark');
    settingsJson.Add('language', 'en');
    settingsJson.Add('notifications', True);
    settingsJson.Add('autoSave', False);
    userJson.Add('settings', settingsJson);
    
    WriteLn('    用户数据:');
    WriteLn('      ', userJson.AsJSON);
    
    // 模拟用户数据验证
    var username := userJson.Get('username', '');
    var userId := userJson.Get('userId', 0);
    WriteLn('    用户验证:');
    WriteLn('      用户名: ', username);
    WriteLn('      用户ID: ', userId);
    if Length(username) > 0 then
      WriteLn('      验证结果: 有效')
    else
      WriteLn('      验证结果: 无效');
  finally
    userJson.Free;
  end;
  
  WriteLn;
  
  // API响应处理
  WriteLn('  API响应处理:');
  var responseJson := TJSONObject.Create;
  try
    responseJson.Add('status', 'success');
    responseJson.Add('code', 200);
    responseJson.Add('message', '操作成功');
    
    var dataObj := TJSONObject.Create;
    dataObj.Add('totalCount', 150);
    dataObj.Add('pageSize', 20);
    dataObj.Add('currentPage', 1);
    
    var itemsArray := TJSONArray.Create;
    for var i := 1 to 3 do
    begin
      var itemObj := TJSONObject.Create;
      itemObj.Add('id', i);
      itemObj.Add('title', '项目' + IntToStr(i));
      itemObj.Add('completed', (i mod 2) = 0);
      itemsArray.Add(itemObj);
    end;
    dataObj.Add('items', itemsArray);
    
    responseJson.Add('data', dataObj);
    
    WriteLn('    API响应:');
    WriteLn('      ', responseJson.AsJSON);
  finally
    responseJson.Free;
  end;
end;

// 程序主入口
begin
  WriteLn('=== Pascal JSON处理示例 ===');
  WriteLn;
  
  // 1. JSON对象的创建和操作
  CreateAndManipulateJSONObject;
  
  WriteLn;
  
  // 2. JSON数组的处理
  JSONArrayProcessing;
  
  WriteLn;
  
  // 3. JSON数据的解析
  JSONDataParsing;
  
  WriteLn;
  
  // 4. JSON数据的生成
  JSONDataGeneration;
  
  WriteLn;
  
  // 5. 复杂JSON结构的处理
  ComplexJSONStructureHandling;
  
  WriteLn;
  
  // 6. JSON在实际应用中的使用
  PracticalJSONApplications;
  
  WriteLn;
  WriteLn('演示了 Pascal 中JSON处理的各种用法');
  
  // 等待用户按键，防止程序窗口立即关闭
  ReadLn;
end.